package com.wn.common.model

/**
 * @Author: wn
 * @Date: 2022/12/19 9:49
 * @Description: 其实可以使用kotlin标准库中的Result
 * retrofit--coroutine-APi--create(Response)--ApiSuccessResponse(val body:T)
 * is ApiSuccessResponse(body)--Success(body).isSuccess
 * ReSource.success(body: out T)--ReSource(Status.SUCCESS,data,message)
 */
sealed class DataResult {
  override fun toString(): String {
    return when (this) {
      is Success<*> -> "Success[data=$data]"
      is Error -> "Exception[exception=$exception]"
      Loading -> "loading"
//      else -> "Error"
    }
  }
}

//成功状态的时候
data class Success<out T>(val data: T) : DataResult()

//错误，失败状态的时候
data class Error(val exception: Exception) : DataResult()

//加载数据中
object Loading : DataResult()

/**
 * 扩展属性 因为 该 类中没有此字段 没有默认的 get  set 所以必须  定义 set get  指定类型
 * 返回结果如果是Success类，且data非null,才认为是成功的
 */
val DataResult.isSuccess: Boolean
  get() = this is Success<*> && data !== null

// Resource形式，数据封装
// 资源获取的状态，枚举
enum class Status {
  SUCCESS,
  ERROR,
  LOADING
}

/**
 * 数据封装
 * out 生产者 只能作为  函数返回值 --类型  或着 属性 -- 类型
 * in  消费者 只能作为函数 参数 -- 类型
 */
data class ReSource<out T>(val state: Status, val data: T?, val message: String?) {

  companion object {

    fun <T> success(data: T?) = ReSource(Status.SUCCESS, data, "Resource -- 成功")

    fun <T> error(data: T?, msg: String) = ReSource(Status.ERROR, data, msg)

    fun <T> loading(data: T?) = ReSource(Status.LOADING, data, null)

  }
}